package base.timer
{
	import flash.events.Event;
	import flash.events.EventDispatcher;

	public class TimerTask extends EventDispatcher
	{
		/**
		 *Timer任务唯一ID  
		 */		
		private var _timerID:int;
		/**
		 *Timer任务唯一ID 
		 */
		public function get timerID():int
		{
			return _timerID;
		}
		/**
		 *回调执行函数
		 */
		private var _callBack:Function;
		/**
		 * 其元素作为参数传递给函数的数组
		 */		
		private var _callBackArgArray:Array;
		/**
		 * 任务执行完成后的回调函数
		 */		
		private var _completeCallBack:Function;
		/**
		 * 任务执行完成后的回调函数参数
		 */		
		private var _completeCallBackArgArray:Array;
		/**
		 *最后一次执行任务时间 
		 */		
		private var _lastRunTime:int=0;
		/**
		 *最后一次检查时间 
		 */		
		private var _lastTime:int=0;
		/**
		 * 计时器事件间的延迟（以毫秒为单位）。 
		 */		
		private var _delay:int;
		/**
		 * 设置的计时器运行总次数。 如果重复计数设置为 0，则计时器将持续不断运行，直至调用了 stop() 方法或程序停止。 如果重复计数不为 0，则将运行计时器，运行次数为指定的次数。 如果设置的 repeatCount 总数等于或小于 currentCount，则计时器将停止并且不会再次触发。
		 */
		private var _repeatCount:int;
		/**
		 *当前已执行次数 
		 */		
		private var _runCount:int;
		
		/**
		 * 计时器任务
		 * @param timerID 计时器ID
		 * @param delay 计时器事件间的延迟（以毫秒为单位）。 
		 * @param callBack 每次执行完任务后的回调函数
		 * @param repeatCount 设置的计时器运行总次数。 如果重复计数设置为 0，则计时器将持续不断运行，直至调用了 stop() 方法或程序停止。 如果重复计数不为 0，则将运行计时器，运行次数为指定的次数。 如果设置的 repeatCount 总数等于或小于 currentCount，则计时器将停止并且不会再次触发。
		 * @param callBackArgArray 每次执行完任务后的回调函数的参数
		 * @param completeCallBack 任务执行完成后的回调函数
		 * @param completeCallBackArgArray 任务执行完成后的回调函数参数
		 */		
		public function TimerTask(timerID:int, delay:Number, callBack:Function, repeatCount:int=0, callBackArgArray:Array=null, completeCallBack:Function=null, completeCallBackArgArray:Array=null)
		{
			_timerID=timerID;
			_delay=delay;
			_repeatCount=repeatCount<=0 ? int.MAX_VALUE : repeatCount;
			_callBack=callBack;
			_callBackArgArray=callBackArgArray;
			_completeCallBack=completeCallBack;
			_completeCallBackArgArray=completeCallBackArgArray;
		}
		
		/**
		 *执行任务后回调函数
		 */		
		private function doCallBack():void
		{
			if(_callBack!=null)
			{
				_lastRunTime=_lastTime;
				_runCount++;
				_callBack.apply(null, _callBackArgArray);
				if(_runCount>=_repeatCount)
				{
					end();
				}
			}
		}
		
		/**
		 *更新执行时间频率 
		 * @param dtime 频率时间差
		 */		
		public function update(dtime:int):void
		{
			_lastTime+=dtime;
			var dRuntime:int=_lastTime-_lastRunTime;
			if(dRuntime>=_delay)
			{
				doCallBack();
			}
		}
		
		/**
		 *执行完成 
		 * 
		 */		
		private function end():void
		{
			if(_completeCallBack!=null)
			{
				_completeCallBack.apply(null, _completeCallBackArgArray);
			}
			dispatchEvent(new Event(Event.COMPLETE));
		}
		
		public function dispose():void
		{
			_callBack=null;
			_callBackArgArray=null;
		}
	}
}